from sqlalchemy import create_engine, Column, Integer, String, DateTime, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session
from sqlalchemy import func
from sqllite_pre import Base,get_db
from fastapi import FastAPI, UploadFile, File, HTTPException, Depends, status
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from typing import List, Optional, Union
from pydantic import BaseModel, EmailStr
from users import User

# 用户反馈表模型
class Feedback(Base):
    __tablename__ = "feedback"
    # __table_args__ = {'extend_existing': True}

    id = Column(Integer, primary_key=True, index=True)  # 主键，自增
    user_id = Column(Integer,  nullable=False)  # 外键关联 User.id
    username = Column(String(50),  nullable=False, index=True)  # 关联 User 表的 username
    email = Column(String(100),  nullable=False, index=True)  # 关联 User 表的 email
    subject = Column(String(100), nullable=False)  # 反馈主题，最长 100 个字符
    content = Column(String(500), nullable=False)  # 反馈内容，最长 500 个字符
    status = Column(Boolean, default=False)  # 受理状态,True已受理，False正在受理
    created_at = Column(Integer, server_default=func.now())  # 创建时间，存储为时间戳（毫秒）

class AddFeedback(BaseModel):
    subject: str
    content: str

# Pydantic 模型
class FeedbackResponse(BaseModel):
    id: int
    user_id: int
    username: str
    email: str
    subject: str
    content: str
    status: bool
    created_at: int

    class Config:
        orm_mode = True

def add_feedback(
    db: Session,
    user_id: int,
    username: str,
    email: str,
    subject: str,
    content: str
) -> Feedback:
    """
    添加用户反馈
    :param db: 数据库会话
    :param user_id: 用户id
    :param username: 用户名
    :param email: 用户邮箱
    :param subject: 反馈主题
    :param content: 反馈内容
    :return: 新增的反馈对象
    """
    new_feedback = Feedback(
        user_id=user_id,
        username=username,
        email=email,
        subject=subject,
        content=content,
        status=False  # 默认状态为“正在受理”
    )
    db.add(new_feedback)
    db.commit()
    db.refresh(new_feedback)  # 刷新对象以获取数据库生成的字段（如 id）
    return new_feedback

def delete_feedback(db: Session, feedback_id: int) -> bool:
    """
    删除指定 ID 的用户反馈
    :param db: 数据库会话
    :param feedback_id: 反馈记录的 ID
    :return: 删除是否成功（True 表示成功，False 表示未找到）
    """
    feedback = db.query(Feedback).filter(Feedback.id == feedback_id).first()
    if not feedback:
        return False  # 未找到反馈记录，返回 False
    db.delete(feedback)
    db.commit()
    return True

def handle_feedback(db: Session, feedback_id: int) -> bool:
    """
    受理指定 ID 的用户反馈，将状态改为已受理
    :param db: 数据库会话
    :param feedback_id: 反馈记录的 ID
    :return: 更新是否成功（True 表示成功，False 表示未找到或已受理）
    """
    feedback = db.query(Feedback).filter(Feedback.id == feedback_id).first()
    if not feedback:
        return False  # 未找到反馈记录
    if feedback.status:  # 如果已受理，无需重复处理
        return False
    feedback.status = True  # 将状态改为“已受理”
    db.commit()
    return True

def get_feedback_records(db: Session, user_id: int) -> List[Feedback]:
    """
    获取反馈记录
    :param db: 数据库会话
    :param user_id: 用户名，默认为 "-1" 表示返回所有记录，否则返回指定用户的记录
    :return: 反馈记录列表
    """
    if user_id == -1:
        # 返回所有反馈记录
        return db.query(Feedback).all()
    else:
        # 返回指定用户的反馈记录
        return db.query(Feedback).filter(Feedback.user_id == user_id).all()